Код:
var Imported = Imported || {};
Imported.DKR_SoundGenerator = true;
var DKR = DKR || {};
DKR.SoundGenerator = DKR.SoundGenerator || {};
DKR.SoundGenerator.version = 1.0;
//-----------------------------------------------------------------------------
/*:
* @plugindesc (v.1.0.0) Плагин позволет генерировать и проигрывать звуки, при помощи библиотеки Tone.js
*
* @target MZ
* @author DarchanKaen, Yotam Mann
*
* @help
* DKR SoundGenerator
* ----------------------------------------------------------------------------
* ---Общая информация:
* Плагин позволяет генерировать и проигрывать звуки, при помощи библиотеки Tone.js
* Плагин является "оберткой", предоставляя:
* 1) "Упрощенную" генерацию звуков по паттерну, их воспроизведение, в.т.ч. зацикленное.
* 2) Полные возможности библиотеки Tone.js - для этого пишите в команде "Скрипт" нужный вам код!
* Звук, генерируемый плагином в упрощенном режиме невозможно остановить!!
* У плагина нет параметров.
* ---Команды(в эвенте команда "Скрипт"):
* DKR.SoundGenerator.beep(); - издает короткий звук, игнорируя все настройки; для теста.
* DKR.SoundGenerator.stopRepeat(); - в случае зацикленности звука, останавливает его воспроизведение.
* DKR.SoundGenerator.setInstrument(instrumentName); - задает инструмент.
* DKR.SoundGenerator.setRepeatPause(pauseValue); - задает паузу при повторе зацикленного звука.
* DKR.SoundGenerator.setBPM(bpmValue); - задает темп звука.
* DKR.SoundGenerator.setVolume(volumeValue); - задает громкость звука.
* DKR.SoundGenerator.generate(pattern, timing, isRepeat); - задает паттерн для генерации, длительность звука, зациклить ли воспроизведения.
* где:::
* instrumentName - имя инструмента, одно из: 'Synth' (по-умолчанию),
* 'AMSynth', 'DuoSynth', 'FMSynth', 'MembraneSynth', 'MetalSynth',
* 'MonoSynth', 'NoiseSynth', 'PluckSynth', 'PolySynth'.
* pauseValue - длительность перед повтором звука (по-умолчанию: 0.5).
* bpmValue - темп звука (по-умолчанию: 100)
* volumeValue - громкость звука (для уменьшения пишите отрицательное число).
* pattern - массив, состоящий из объектов звуков, что хранят в себе ноту с октавой и длительность, например:
* let pattern = [
* { note: "E5", duration: "8n" },
* { note: "A4", duration: "8n" },
* { note: "F8", duration: "8n" },
* { note: "D1", duration: "8n" }
* ];
* timing - длительность нот (например: 0.25).
* isRepeat - true (если нужна зацикленность звука) / false (если звук должен быть однократно воспроизведен).
* ---НЮАНСЫ:
* 1) Генерируемый звук проигрывается поверх всех звуков мейкера и не контролируется его командами.
* 2) Звук остановить нельзя, только выключить если он зациклен.
* 3) Не все инструменты, ноты и время воспроизведения корректно работают друг с другом - проверяйте!
* 4) Если вы знаете работу данной библиотеки, то пишите в команде "Скрипт" код для Tone.js и мейкер его сможет выполнить.
* 5) Инструмент Sampler не входит в "упрощенный режим", т.к. зависит от внешних файлов.
* 6) В любом случае, для корректного использования плагина ознакомьтесь з возможностями Tone.js отдельно от мейкера.
*
*/
( () => {
//---TONE_JS: BEGIN
const TONE_JS = 'Вырезано, т.к. ложило сайт. Скачайте плагин и откройте блокнотом для просмотра!';
//---TONE_JS: END
//--DATA: BEGIN
let instrument = new Tone.Synth().toDestination();
let repeatPause = 0.5;
let bpm = 100;
let volume = 0;
//--DATA: END
//---LOGIC: BEGIN
const beepSound = () => {
const synth = new Tone.Synth().toDestination();
synth.triggerAttackRelease("C4", "8n");
}
const stopSoundRepeat = () => {
Tone.Transport.stop();
}
const setSoundInstrument = (instrumentName) => {
switch(instrumentName){
case 'AMSynth':
instrument = new Tone.AMSynth().toDestination();
break;
case 'DuoSynth':
instrument = new Tone.DuoSynth().toDestination();
break;
case 'FMSynth':
instrument = new Tone.FMSynth().toDestination();
break;
case 'MembraneSynth':
instrument = new Tone.MembraneSynth().toDestination();
break;
case 'MetalSynth':
instrument = new Tone.MetalSynth().toDestination();
break;
case 'MonoSynth':
instrument = new Tone.MonoSynth().toDestination();
break;
case 'NoiseSynth':
instrument = new Tone.NoiseSynth().toDestination();
break;
case 'PluckSynth':
instrument = new Tone.PluckSynth().toDestination();
break;
case 'Synth':
instrument = new Tone.Synth().toDestination();
break;
default:
instrument = new Tone.Synth().toDestination();
break;
}
}
const setSoundRepeatPause = (rPause) => {
repeatPause = rPause;
}
const setSoundBPM = (nBPM) => {
bpm = nBPM;
}
const setSoundVolume = (nVolume) => {
volume = nVolume;
}
const generateSound = (notesList, timing, isRepeat = false) => {
Tone.Transport.stop();
let repeatInterval = ( notesList.length * timing ) + repeatPause;
const melody = () => {
notesList.forEach( (tune, index) => {
const now = Tone.now();
let tuneTiming = index * timing;
instrument.triggerAttackRelease(tune.note, tune.duration, now + tuneTiming);
})
};
Tone.Transport.bpm.value = bpm;
instrument.volume.value += volume;
if(true === isRepeat){
Tone.Transport.scheduleRepeat(melody, repeatInterval);
}else{
Tone.Transport.scheduleOnce(melody);
}
Tone.Transport.start();
}
//---LOGIC: END
//---COMMANDS: BEGIN
DKR.SoundGenerator.beep = function(){
beepSound();
}
DKR.SoundGenerator.stopRepeat = function(){
stopSoundRepeat();
}
DKR.SoundGenerator.setInstrument = function(instrumentName){
setSoundInstrument(instrumentName);
}
DKR.SoundGenerator.setRepeatPause = function(repeatPause){
setSoundRepeatPause(repeatPause);
}
DKR.SoundGenerator.setBPM = function(newBPM){
setSoundBPM(newBPM);
}
DKR.SoundGenerator.setVolume = function(newVolume){
setSoundVolume(newVolume);
}
DKR.SoundGenerator.generate = function(argsObj, timing, isRepeat){
generateSound(argsObj, timing, isRepeat);
}
//---COMMANDS: END
})();
Социальные закладки